package 操作系统实验.实验二;
/**
 * 项目名称: projectweb <br>
 * 文件名称:  <br>
 * 文件描述: 这里添加您的类文件描述，说明当前文件要包含的功能。 <br>
 * 文件创建：1913040634刘世锦  <br>
 * 创建时间: 2021/4/8 <br>
 *
 * @version v1.0 <br>
 * @update [序号][日期YYYY-MM-DD][更改人姓名][变更描述]<br>
 */

import java.util.Scanner;

/**
 * @ProjectName: projectweb
 * @ClassName: ProgressMain
 * @Description: 实现类
 * @Author: 1913040634刘世锦
 * @Date: 2021/4/8 17:01 .
 * @version v1.0
 */

public class ProgressMain {
//用于对浮点数四舍五入，保留小数位数
 static java.text.DecimalFormat   df   =new   java.text.DecimalFormat("#.0");
 //定义用于保存在个算法下执行作业的顺序的数组
 static int Fqueue[];
 static int Squeue[];
 static int Gqueue[];
//先来先服务调度算法
    public static void FCFS(ProgressData a[]) {
        int preFinished=0;
        ProgressData a1[]=a;
        Fqueue=new int[5];  //用于记录执行作业的顺序的数组
    for (int i = 0; i < a1.length; i++) {
        a1[i].finished[0]=preFinished+a1[i].server;  //算完成时间 当前完成时间是=已经完成时间+当前作业的server时间
        a1[i].working[0]=a1[i].finished[0]-a1[i].arrived;  //算周转时间
        a1[i].powerWorking[0]=Float.parseFloat(df.format(a1[i].working[0]/(float)a1[i].server));  //算带权周转时间
        preFinished=a1[i].finished[0];  //累加变量
        Fqueue[i]=i;
}
}

    //短作业优先调度算法
    public static void SJF(ProgressData a[]) {
        int preFinished=0;
        int num=-1,min=4444;
        ProgressData a1[]=a;
         Squeue=new int[5];
        for (int ii = 0; ii < a1.length; ii++) {
        min=4444;
        for (int i = 0; i < a1.length; i++) {  //查找最短作业
        	if (a1[i].server<min&&a1[i].finished[1]==0&&a1[i].arrived<=preFinished) {
        		min=a1[i].server;
        		num=i;
        	}
        }
        Squeue[ii]=num;
        a1[num].finished[1]=preFinished+a1[num].server;
        a1[num].working[1]=a1[num].finished[1]-a1[num].arrived;
        a1[num].powerWorking[1]=Float.parseFloat(df.format(a1[num].working[1]/(float)a1[num].server));
        //df.format(a1[num].powerWorking[1]);
        preFinished =a1[num].finished[1];
        }
}
    //高响比调度算法
    public static void GaoXiangBi(ProgressData a[]){
        int preFinished=0;
        int num=0;
        float priority=-1000;
        ProgressData a1[]=a;
         Gqueue=new int[5];
        for (int ii = 0; ii < a1.length; ii++) {
        priority=-1000;
        for (int i = 0; i < a1.length; i++) {
        	int sub=(((preFinished-a1[i].arrived)+a1[i].server)/a1[i].server);
        	if (sub>priority&&a1[i].finished[2]==0&&a1[i].arrived<=preFinished) {
        		priority=sub;
        		num=i;
        	}
       }
        Gqueue[ii]=num;
        a1[num].finished[2]=preFinished+a1[num].server;
        a1[num].working[2]=a1[num].finished[2]-a1[num].arrived;
        a1[num].powerWorking[2]=Float.parseFloat(df.format(a1[num].working[2]/(float)a1[num].server));
        preFinished =a1[num].finished[2];
        }

    }


    public static void main(String[] args) {
            ProgressData p[]=new ProgressData[4];
            System.out.println("共输入4个进程");
           Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个进程的到达时间 和服务时间");
            p[0]=new ProgressData(sc.nextInt(),sc.nextInt());
        System.out.println("请输入第二个进程的到达时间 和服务时间");
            p[1]=new ProgressData(sc.nextInt(),sc.nextInt());
        System.out.println("请输入第三个进程的到达时间 和服务时间");
            p[2]=new ProgressData(sc.nextInt(),sc.nextInt());
        System.out.println("请输入第四个进程的到达时间 和服务时间");
            p[3]=new ProgressData(sc.nextInt(),sc.nextInt());
      //  System.out.println("请输入第5个进程的到达时间 和服务时间");
      //  p[4]=new ProgressData(sc.nextInt(),sc.nextInt());
            FCFS(p);
            SJF(p);
            GaoXiangBi(p);
            System.out.println("以下是相同作业的相同到达时间和运行时间，在三种算法（FCFS,SJF,G高响比）下的运行性能指标：");
            System. out . println("到达时间 服务时间 F完成时间 F周转时间 F带权周转时间 S完成时间 S周转时间 S带权周转时间 G完成时间 G周转时间 G带权周转时间");
            System.out.println(p[0]);
            System.out.println(p[1]);
            System.out.println(p[2]);
            System.out.println(p[3]);
       // System.out.println(p[4]);
            System.out.println();
            System.out.println();
            System.out.println("3中算法下作业的执行顺序如下:");
            System.out.print("FCFS算法下作业的执行流程：");
            for(int a:Fqueue)
            {
              System.out.print(a+" ");
                }
                System.out.println();

                System.out.print("SJF算法下作业的执行流程：");
                for(int a:Squeue)
                {
         System.out.print(a+" ");
                }
                System.out.println();

                System.out.print("高相应比算法下作业的执行流程：");
                for(int a:Gqueue)
                {
          System.out.print(a+" ");
                }

    }
}
